package co.edu.usbcali.servicio.rest;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.stereotype.Controller;

import co.edu.usbcali.modelo.Colecciones;
import co.edu.usbcali.modelo.Entradas;
import co.edu.usbcali.modelo.Rss;
import co.edu.usbcali.modelo.Usuarios;
import co.edu.usbcali.modelo.dto.Entrada;
import co.edu.usbcali.modelo.dto.EntradasDTO;
import co.edu.usbcali.modelo.dto.RssDTO;
import co.edu.usbcali.modelo.restdto.ColeccioneRestDTO;
import co.edu.usbcali.presentation.businessDelegate.IBusinessDelegatorView;
import co.edu.usbcali.utilities.ApplicationContextHolder;
 

@Path("coleccion")
@Controller
public class ColeccionRest {
	
	@GET
	@Produces("application/json")
	@Path("/traerColecciones/{codUsuario}")
	public List<ColeccioneRestDTO> traerColecciones(@PathParam("codUsuario") Long codUsuario){
		
		List<ColeccioneRestDTO> listaCategorias=null;
		try {
			
			IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);			
			Usuarios usu=businessDelegatorView.getUsuarios(codUsuario);
			listaCategorias=businessDelegatorView.getDataColeccionesRest(usu.getEmail());
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
			
		return listaCategorias;

	}
	
	@GET
	@Produces("application/json")
	@Path("/crearColeccion/{nombre}/{codUsuario}")
	public ColeccioneRestDTO crearColeccion(@PathParam("nombre") String nombre, @PathParam("codUsuario") Long codUsuario){
		
		ColeccioneRestDTO coleccion=new ColeccioneRestDTO();
		try {
			nombre=nombre.replaceAll("_", " ");
			
			IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
			Usuarios usu=businessDelegatorView.getUsuarios(codUsuario);
			Colecciones cole=new Colecciones();
			cole.setNombre(nombre);
			cole.setUsuarios(usu);
			businessDelegatorView.saveColecciones(cole);
			
			coleccion.setNombre(cole.getNombre());
			coleccion.setCodigoCole(cole.getCodigoCole());
			
		} catch (Exception e) {
			coleccion.setError(e.getMessage());
		}	
			
		return coleccion;

	}
	
	@GET
	@Produces("application/json")
	@Path("/modificarColeccion/{nombre}/{codCole}/{codUsuario}")
	public ColeccioneRestDTO modificarColeccion(@PathParam("nombre") String nombre, @PathParam("codCole") Long codCole, @PathParam("codUsuario") Long codUsuario){
		
		ColeccioneRestDTO coleccion=new ColeccioneRestDTO();
		try {
			nombre=nombre.replaceAll("_", " ");
			IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
			Colecciones cole=businessDelegatorView.getColecciones(codCole);
			cole.setNombre(nombre);
			businessDelegatorView.updateColecciones(cole);
			
			coleccion.setNombre(cole.getNombre());
			coleccion.setCodigoCole(cole.getCodigoCole());
			
		} catch (Exception e) {
			coleccion.setError(e.getMessage());
		}	
			
		return coleccion;

	}
	
	@GET
	@Produces("text/plain")
	@Path("/eliminarColeccion/{codCole}")
	public String eliminarColeccion(@PathParam("codCole") Long codCole){
		
		String mensaje="";
		try {
			
			IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
			Colecciones cole=businessDelegatorView.getColecciones(codCole);
			businessDelegatorView.deleteColecciones(cole);
			mensaje="La coleccion se elimino con exito";
		} catch (Exception e) {
			mensaje=e.getMessage();
		}	
			
		return mensaje;

	}	
	
	@GET
	@Produces("application/json")
	@Path("/traerRssFavoritos/{codUsuario}")
	public List<Entrada> traerRssFavoritos(@PathParam("codUsuario") Long codUsuario){
		
		List<Entrada> rss=new ArrayList<Entrada>();
    	
    	try {
    	IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
        List<EntradasDTO> entradasFBD=	businessDelegatorView.consultarFavoritosUsuario(codUsuario);
        
        Entrada entrada=null;
        for (int i = 0; i < entradasFBD.size(); i++) {
			
        	String urlStr=entradasFBD.get(i).getUrl();
        	   
        	Connection con = Jsoup.connect(urlStr);
        	con.timeout(300000);

        		    con.userAgent("Google Chrome 3.0");
        		    Document doc = con.get();

        		    String titulo = doc.title();
        		    
        		        entrada=new Entrada();
        		    	entrada.setEnlace(urlStr);
        		    	entrada.setTitulo(titulo);
        		    	entrada.setDescripcion(doc.select("meta[name=description]").get(0).attr("content"));
        		    	entrada.setCodigoEntrada(entradasFBD.get(i).getCodigoEntra());
        		    	entrada.setCodigoRss(entradasFBD.get(i).getCodigoRss_Rss());
        		    	rss.add(entrada);
            	
		}
               
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
			
		return rss;

	}
	
	@GET
	@Produces("application/json")
	@Path("/traerRssColeccion/{codColeccion}")
	public List<RssDTO> traerRssColeccion(@PathParam("codColeccion") Long codColeccion){
		
		List<RssDTO> listaRss=new ArrayList<RssDTO>();
    	
    	try {
    	IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
        listaRss=	businessDelegatorView.rssColeccion(codColeccion);
               
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
			
		return listaRss;

	}
	
	
	@GET
	@Produces("text/plain")
	@Path("/leerEntrada/{codRSS}/{urlEntrada}/{codUsuario}")
	public String leerEntrada(@PathParam("codRSS") Long codRSS, @PathParam("urlEntrada") String urlEntrada, 
			                  @PathParam("codUsuario")Long codUsuario){
		
		String mensaje="";
		try {
			
			IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
    		Entradas entrada=new Entradas();
    		entrada.setUrl(urlEntrada);
    		entrada.setFavorito("N");
    		entrada.setLeido("S");
    		entrada.setFechaLeido(new Date());
    		entrada.setRss(businessDelegatorView.getRss(codRSS));
    		entrada.setCodigoUsua(codUsuario);
    		
    		businessDelegatorView.leerEntrada(entrada);
						
			mensaje="Entrada Leida";
		} catch (Exception e) {
			mensaje=e.getMessage();
		}	
			
		return mensaje;

	}
	
	@GET
	@Produces("text/plain")
	@Path("/favoritoEntrada/{codRSS}/{urlEntrada}/{codUsuario}")
	public String favoritoEntrada(@PathParam("codRSS") Long codRSS, @PathParam("urlEntrada") String urlEntrada, 
			                  @PathParam("codUsuario")Long codUsuario){
		
		String mensaje="";
		try {
			
			IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);	
    		Entradas entrada=new Entradas();
    		entrada.setUrl(urlEntrada);
    		entrada.setFavorito("S");
    		entrada.setFechaFavorito(new Date());
    		entrada.setLeido("N");
    		entrada.setRss(businessDelegatorView.getRss(codRSS));
    		entrada.setCodigoUsua(codUsuario);
    		
    		businessDelegatorView.leerEntrada(entrada);
						
			mensaje="Entrada Leida";
		} catch (Exception e) {
			mensaje=e.getMessage();
		}	
			
		return mensaje;

	}
	
	@GET
	@Produces("application/json")
	@Path("/crearRss/{codColeccion}/{urlRss}")
	public RssDTO crearRss(@PathParam("codColeccion") Long codColeccion, @PathParam("urlRss") String urlRss){
		
		RssDTO rss=new RssDTO();
    	
    	try {
    	IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);
    	Rss rssNuevo=new Rss();
    	urlRss=urlRss.replace("@","/"); 
    	rssNuevo.setUrl(urlRss);
    	rssNuevo.setCodigoCole(codColeccion);
    	rss.setUrl(rssNuevo.getUrl());
    	rss.setCodigoRss(rssNuevo.getCodigoRss());
        businessDelegatorView.saveRss(rssNuevo);
        
		} catch (Exception e) {
			rss.setError(e.getMessage());
		}	
			
		return rss;

	}
	
	@GET
	@Produces("text/plain")
	@Path("/eliminarRss/{codRss}")
	public String eliminarRss(@PathParam("codRss") Long codRss){
    	
		String mensaje=null;
    	try {
    	IBusinessDelegatorView businessDelegatorView=ApplicationContextHolder.getContext().getBean(IBusinessDelegatorView.class);
    	Rss rss=businessDelegatorView.getRss(codRss);
        businessDelegatorView.deleteRss(rss);
        mensaje="El Rss Elimino con exito";
		} catch (Exception e) {
			mensaje=e.getMessage();
		}				
		return mensaje;

	}

}